package com.tedu.day02.oop;

/**
 * 抽象类：抽象类与抽象方法   关键字：abstract
 * 类：只能提供行为概念，没有具体实现行为
 *
 * 抽象类与面向对象--多态绝对关系【向上造型创建抽象对象】
 * 使用多态创建抽象类对象，抽象类本身无法创建对象，需要使用多态完成抽象类创建
 *
 * 什么是抽象类？
 * 复杂项目时，需要在不同类下实现不同的功能，首先抽象类【Android常用】
 *
 * 定义抽象类与抽象方法？
 * 抽象类：修饰符  abstract class  类名{}   -----毫无意义，必须结合抽象方法
 * 抽象方法：修饰符   abstract  返回值  方法名（参数）  -----没有具体的实现
 *
 * 抽象类“实例化：创建对象”：抽象类自身无法实例化
 * ①创建【n个】子类（每个子类只能继承一个抽象父类），继承抽象【父】类，子类一定实现抽象【父】类的所有抽象方法
 * ②使用面向对象：多态【向上造型】  抽象类  引用=new 【实现】子类();
 * 注意：抽象类一定发生重写，子类继承抽象【父】类，也可以叫“实现类”！
 */

abstract class Animals {     //抽象类
    //抽象方法:没有具体的实现【没有代码块】---一定继承----一定多态性【造型】
    public abstract void say();

    //①定义由final修饰的抽象方法？ -------×
    // public final abstract void sleep();
    //②定义一个抽象变量 ？ ------×
    // abstract int i=1;
    //③定义一个静态变量？ ------√
    static int i = 1;

    //④定义一个静态抽象变量？-----×
    //static abstract int j=1;
    //⑤定义一个静态抽象方法【无实现】-----× 静态抽象二选一
    //public static abstract void eat();
    //⑥定义一个静态方法【无实现：空代码块】-----√  【public static void eat();报错】
    public static void eat(){};

    //⑤⑥总结:抽象方法/静态方法，方法定义：修饰符 static|abstract 返回值  方法
    //⑦定义内部类和静态内部类？-----√
    static class Sos {
    }
    //⑧抽象类有构造器吗？-----√  【右键-生成-构造函数】

    public Animals() {
    }

    //⑨抽象类普通实现方法-----√
    public void run() {
    }
 }
    //⑩抽象类可以继承抽象类吗?  实现：两个抽象类--形容一个实现-----√
   abstract class Thing extends Animals{
    public abstract void sleep();
    }
  //目的：实现类中所有抽象类方法---继承【子】抽象类



//实现类：实现抽象【父】类的方法----多个实现类---继承---抽象
class Person1 extends Animals{    //报错原因：完成重写

    public void say() {
        System.out.println("人---说话~~");
    }

}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象类无法创建对象:只提供抽象方法---必须由子类实现---多态【造型】【Animals a=new Animals();报错】
        Animals a=new Person1();
        a.say();  //向上造型---重写：抽象【父】类的抽象方法【覆盖】
    }
}
